package model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Cargo implements Comparator<Cargo> {

  private int id, qntdDigitos;
  private String nome;
  private boolean possuiVice;
  private boolean possuiSuplentes;

  public static final String NOME_ARQUIVO = "C:/Urna/cargos.txt";
  public static final String NOME_ARQUIVO_TEMP = "C:/Urna/cargostem.txt";

  public Cargo() {

  }

  public Cargo(int id, String nome, int qntDigitos, boolean possuiVice, boolean possuiSuplentes) {
    this.id = id;
    this.nome = nome.toUpperCase();
    this.qntdDigitos = qntDigitos;
    this.possuiVice = possuiVice;
    this.possuiSuplentes = possuiSuplentes;
  }

  public Cargo(String nome, int qntDigitos, boolean possuiVice, boolean possuiSuplentes) {
    this.nome = nome.toUpperCase();
    this.qntdDigitos = qntDigitos;
    this.possuiVice = possuiVice;
    this.possuiSuplentes = possuiSuplentes;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getNome() {
    return nome.toUpperCase();
  }

  public void setNome(String nome) {
    this.nome = nome.toUpperCase().replace(";", "");
  }

  public int getQntdDigitos() {
    return qntdDigitos;
  }

  public void setQntdDigitos(int qntdDigitos) {
    this.qntdDigitos = qntdDigitos;
  }

  public boolean isPossuiVice() {
    return possuiVice;
  }

  public void setPossuiVice(boolean possuiVice) {
    this.possuiVice = possuiVice;
  }

  public boolean isPossuiSuplentes() {
    return possuiSuplentes;
  }

  public void setPossuiSuplentes(boolean possuiSuplentes) {
    this.possuiSuplentes = possuiSuplentes;
  }
  
  public static void inserir(Cargo cargo) {

    try (PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(new File(NOME_ARQUIVO), true)))) {
      
      writer.write(getProxId() + ";"
              + cargo.getNome() + ";"
              + cargo.getQntdDigitos() + ";");
      
      if(cargo.isPossuiVice()) {
        writer.write("S;");
      }else{
        writer.write("N;");
      }
      if(cargo.isPossuiSuplentes()) {
        writer.write("S\r\n");
      }else{
        writer.write("N\r\n");
      }

      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static int getProxId() {

    String linha;
    int maxIdCargo = 0;

    try {

      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");
        maxIdCargo = Integer.parseInt(t[0]);
      }
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }

    return maxIdCargo + 1;
  }

  public static void deletar(String cargoNome) {
    
    String linha;

    Cargo cargo = consultar(cargoNome);

    try {

      BufferedWriter writer = new BufferedWriter(new FileWriter(NOME_ARQUIVO_TEMP));
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");

        if (!(cargo.getId() == Integer.parseInt(t[0]))) {
          writer.write(linha + "\r\n");
        }
      }
      writer.close();
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }

    while (new File(NOME_ARQUIVO).exists()) {
      new File(NOME_ARQUIVO).delete();
    }
    new File(NOME_ARQUIVO_TEMP).renameTo(new File(NOME_ARQUIVO));

  }

  public static Cargo consultar(String nome) {

    String linha;
    nome = nome.toUpperCase();
    Cargo cargoModel = new Cargo();
    
    try {

      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");
        
        if (nome.equals(t[1])) {
          
          //return new Cargo(Integer.parseInt(t[0]), t[1], Integer.parseInt(t[2]));
          
          cargoModel.setId(Integer.parseInt(t[0]));
          cargoModel.setNome(t[1]);
          cargoModel.setQntdDigitos(Integer.parseInt(t[2]));
          if(t[3].equals("S")) {
            cargoModel.setPossuiVice(true);
          }else if(t[3].equals("N")) {
            cargoModel.setPossuiVice(false);
          }
          if(t[4].equals("S")) {
            cargoModel.setPossuiSuplentes(true);
          }else if(t[4].equals("N")) {
            cargoModel.setPossuiSuplentes(false);
          }
          
          return cargoModel;
        }
      }
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }

    return null;
  }

  public static void editar(Cargo cargoOld, Cargo cargoNew) {
    
    String linha;
    String candidatoString = cargoOld.getId() + ";"
            + cargoNew.getNome() + ";"
            + cargoNew.getQntdDigitos() +";";
    if(cargoNew.isPossuiVice()) {
      candidatoString = candidatoString.concat("S;");
    }else{
      candidatoString = candidatoString.concat("N;");
    }
    if(cargoNew.isPossuiSuplentes()) {
      candidatoString = candidatoString.concat("S");
    }else{
      candidatoString = candidatoString.concat("N");
    }
    
    try {

      BufferedWriter writer = new BufferedWriter(new FileWriter(NOME_ARQUIVO_TEMP));
      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");

        if (cargoOld.getId() == Integer.parseInt(t[0])) {
          linha = linha.replace(linha, candidatoString);
        }

        writer.write(linha + "\r\n");
      }
      writer.close();
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }

    while (new File(NOME_ARQUIVO).exists()) {
      new File(NOME_ARQUIVO).delete();
    }
    new File(NOME_ARQUIVO_TEMP).renameTo(new File(NOME_ARQUIVO));
  }

  public static ArrayList getAllCargos() {

    ArrayList<Cargo> listaCargos = new ArrayList<>();
    String linha;

    try {

      BufferedReader reader = new BufferedReader(new FileReader(NOME_ARQUIVO));

      while ((linha = reader.readLine()) != null) {

        String[] t = linha.split(";");
        Cargo cargoModel = new Cargo();
        
        cargoModel.setId(Integer.parseInt(t[0]));
        cargoModel.setNome(t[1]);
        cargoModel.setQntdDigitos(Integer.parseInt(t[2]));
        cargoModel.setPossuiVice(t[3].equals("S"));
        cargoModel.setPossuiSuplentes(t[4].equals("S"));
        
        listaCargos.add(cargoModel);
      }
      reader.close();

    } catch (IOException e) {
      e.printStackTrace();
    }
    /* Ordena a lista de cargo por quantidade de digitos */
    Collections.sort(listaCargos, new Cargo());

    return listaCargos;
  }

  @Override
  public int compare(Cargo o1, Cargo o2) {
    if (o1 == null || o2 == null) {
      return 0;
    }
    return o2.qntdDigitos - o1.qntdDigitos;
  }
  
  /*
  Funcao para saber se existem cargos cadastrados, ao selecinar o perfil eleitor.
  */
  public static boolean isEmpty() {
    if (new File(NOME_ARQUIVO).length() == 0) {
      return true;
    } else {
      return false;
    }
  }
}
